/******************************************************************************
 *                     Organizaci�n de Datos - 75.06                          *
 *                         C�tedra Lic. Servetto                              *
 *            Facultad de Ingenier�a - Universidad de Buenos Aires            *
 ******************************************************************************/ 

#include "ManejadorEspacioLibre.h"
#include <fstream>
#include <iostream>

using namespace std;

namespace CapaFisica
{

	ManejadorEspacioLibre::ManejadorEspacioLibre(string clase)
	{

		// El nombre del archivo esta compuesto por el nombre de la clase y la extension
		// cel (control de espacio libre).
		string fileName = "Datos/" + clase + ".espaciolibre.txt";

		// Intenta abrir el archivo como de escritura y lectura, y modo texto.
		file.open(fileName.c_str(), ios::in | ios::out );
		
		// Crea el archivo si este no existe y lo vuelve a abrir
		if ( !file.is_open() )
		{
			file.clear();
			file.open( fileName.c_str(), ios::out );
			file.close();

			file.open( fileName.c_str(), ios::in | ios::out );

			if ( !file.is_open() )
			{
				cerr << "CapaFisica->ManejadorEspacioLibre.cpp->anejadorEspacioLibre::ManejadorEspacioLibre(string clase)" << endl << "No se pudo abrir el archivo de espacio libre" <<  endl;
				throw new exception();
			}
		}

	}

	ManejadorEspacioLibre::~ManejadorEspacioLibre()
	{

		file.close();

	}

	/************************************************************************
	 *                      Metodos de Ayuda (Helpers)                      *
	 ************************************************************************/

	char* ManejadorEspacioLibre::EnteroAString(int entero, char digitos)
	{

		char* result = new char[digitos+1];

		int potencia = 10;

		// Calcula el valor de cada digito del entero
		for ( int i = 0 ; i < digitos ; i++ )
		{
			char valor = ( entero % potencia )/( potencia/10 );
			result[ ( digitos - 1 ) - i ] = DigitoACaracter( valor );
			potencia = potencia*10 ;
		}
		
		// Formatea el string
		result[ digitos ] = '\0' ;

		return result;

	}

	int ManejadorEspacioLibre::StringAEntero(char* c)
	{
		return atoi(c);
	}

	char ManejadorEspacioLibre::DigitoACaracter(char c)
	{
		
		switch(c)
		{
			case 0: return '0';
			case 1: return '1';
			case 2: return '2';
			case 3: return '3';
			case 4: return '4';
			case 5: return '5';
			case 6: return '6';
			case 7: return '7';
			case 8: return '8';
			case 9: return '9';
			default:
				cerr << "CapaFisica->ManejadorEspacioLibre.cpp->ManejadorEspacioLibre::DigitoACaracter(char c)" << endl << "No se puede convertir el digito a caracter" << endl;
				throw new exception();
		}

	}

	char ManejadorEspacioLibre::CaracterADigito(char c)
	{
		
		switch(c)
		{
			case '0': return 0;
			case '1': return 1;
			case '2': return 2;
			case '3': return 3;
			case '4': return 4;
			case '5': return 5;
			case '6': return 6;
			case '7': return 7;
			case '8': return 8;
			case '9': return 9;
			default:
				cerr << "CapaFisica->ManejadorEspacioLibre.cpp->ManejadorEspacioLibre::CaracterADigito(char c)" << endl << "No se puede convertir el caracter a digito" << endl;
				throw new exception();
		}

	}

}
